package com.zhilianbao.leyaogo.ui.activity.rong;

import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.bql.utils.CheckUtils;
import com.zhilianbao.leyaogo.R;
import com.zhilianbao.leyaogo.http.api.AccountApi;
import com.zhilianbao.leyaogo.http.callback.JsonCallback;
import com.zhilianbao.leyaogo.model.response.me.UserDetailsInfo;
import com.zhilianbao.leyaogo.utils.Utils;
import com.zhilianbao.leyaogo.utils.XToastUtils;
import com.zhilianbao.leyaogo.view.dialog.LeProgressDialog;

import io.rong.imkit.RongIM;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.CSCustomServiceInfo;
import io.rong.imlib.model.UserInfo;
import okhttp3.Call;
import okhttp3.Response;

/**
 * Created by liu on 2016/11/1.
 * 客服聊天
 */
public class ContactServerActivity extends AppCompatActivity {

    String portraitUri = "";
    private UserDetailsInfo mUserDetailsInfo;
    private String mUserName;
    private String mNickName;
    private String mUserPic;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact_server);

        //获取保存信息
        String rongyunToken = Utils.getRongyunToken();
        mUserDetailsInfo = Utils.getUserInfo();
        initNickName();
        initPic();

        //融云token
        if (CheckUtils.isEmpty(rongyunToken) ) {
            getSeverToken();
        } else {
            connect(rongyunToken);
        }

        setUserInfo();

        finish();
    }

    //初始化头像
    private void initPic() {
        mUserPic = Utils.returnUrlShow(mUserDetailsInfo.getUserPic());
        if (CheckUtils.isEmpty(mUserPic)) {
            mUserPic = "http://";
        }
    }

    //初始化昵称
    private void initNickName() {
        mNickName = mUserDetailsInfo.getNickName();
        if (CheckUtils.isEmpty(mNickName)) {
            mNickName ="";
        }
    }

    //启动客服
    private void startCustomer() {
        //首先需要构造使用客服者的用户信息
        CSCustomServiceInfo.Builder csBuilder = new CSCustomServiceInfo.Builder();
        CSCustomServiceInfo csInfo = csBuilder.nickName(mNickName).build();

        /**
         * 启动客户服聊天界面。
         *
         * @param context           应用上下文。
         * @param customerServiceId 要与之聊天的客服 Id。
         * @param title             聊天的标题，如果传入空值，则默认显示与之聊天的客服名称。
         * @param customServiceInfo 当前使用客服者的用户信息。{@link CSCustomServiceInfo}
         */
        String rongyunId = Utils.getRongyunId();//获取融云客服id
        if (CheckUtils.isEmpty(rongyunId)) {
            XToastUtils.showShortToast("您好未选择运营商,请选择运营商");
            return;
        }
//        String id = "KEFU148471998719808";      //开发环境的客服ID
//        String id = "KEFU148489197131875";    //生产环境的客服ID
        RongIM.getInstance().startCustomerServiceChat(this, rongyunId, "", csInfo);
//        /**
//         * 启动单聊
//         * context - 应用上下文。
//         * targetUserId - 要与之聊天的用户 Id。
//         * title - 聊天的标题，如果传入空值，则默认显示与之聊天的用户名称。
//         */
//        if (RongIM.getInstance() != null) {
//            RongIM.getInstance().startPrivateChat(ContactServerActivity.this, "aa", "");
//        }

    }

    private void setUserInfo() {
        /**
         * 设置用户信息的提供者，供 RongIM 调用获取用户名称和头像信息。
         *
         * @param userInfoProvider 用户信息提供者。
         * @param isCacheUserInfo  设置是否由 IMKit 来缓存用户信息。<br>
         *                         如果 App 提供的 UserInfoProvider
         *                         每次都需要通过网络请求用户数据，而不是将用户数据缓存到本地内存，会影响用户信息的加载速度；<br>
         *                         此时最好将本参数设置为 true，由 IMKit 将用户信息缓存到本地内存中。
         * @see UserInfoProvider
         */
        RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {

            @Override
            public UserInfo getUserInfo(String userId) {
                UserInfo userInfo = new UserInfo(String.valueOf(mUserDetailsInfo.getUserId()), mUserDetailsInfo.getNickName(), Uri.parse(mUserPic));
                return userInfo;//根据 userId 去你的用户系统里查询对应的用户信息返回给融云 SDK。
            }

        }, true);
    }

    //获取服务器的token
    private void getSeverToken() {
        long userId = mUserDetailsInfo.getUserId();
        if (CheckUtils.isEmpty(mUserDetailsInfo.getNickName())) {
            mUserName = mUserDetailsInfo.getUserMobile();
        } else {
            mUserName = mUserDetailsInfo.getNickName();
        }
        if (mUserDetailsInfo.getUserPic() != null) {
            portraitUri = mUserDetailsInfo.getUserPic();
        }
        AccountApi.getCustomerToken(this, userId, mUserName, portraitUri, new JsonCallback<String>(this) {

            @Override
            public void onSuccess(String s, Call call, Response response) {
                Utils.putRongyunToken(s);
                connect(s);
            }
        });
    }

    /**
     * <p>连接服务器，在整个应用程序全局，只需要调用一次，需在 之后调用。</p>
     * <p>如果调用此接口遇到连接失败，SDK 会自动启动重连机制进行最多10次重连，分别是1, 2, 4, 8, 16, 32, 64, 128, 256, 512秒后。
     * 在这之后如果仍没有连接成功，还会在当检测到设备网络状态变化时再次进行重连。</p>
     *
     * @param token 从服务端获取的用户身份令牌（Token）。
     * @return RongIM  客户端核心类的实例。
     */
    private void connect(String token) {
//        if (getApplicationInfo().packageName.equals(LeYaoGoApplication.getProcessName(android.os.Process.myPid()))) {

            RongIM.connect(token, new RongIMClient.ConnectCallback() {

                /**
                 * Token 错误。可以从下面两点检查 1.  Token 是否过期，如果过期您需要向 App Server 重新请求一个新的 Token
                 *                  2.  token 对应的 appKey 和工程里设置的 appKey 是否一致
                 */
                @Override
                public void onTokenIncorrect() {
                    getSeverToken();
                }

                /**
                 * 连接融云成功
                 * @param userId 当前 token 对应的用户 id
                 */
                @Override
                public void onSuccess(String userId) {
                    startCustomer();
                    //连接融云成功刷新用户信息
                    refreshUserData();
                }

                /**
                 * 连接融云失败
                 * @param errorCode 错误码，可到官网 查看错误码对应的注释
                 */
                @Override
                public void onError(RongIMClient.ErrorCode errorCode) {

                }
            });
//        }
    }

    private void refreshUserData() {
        /**
         * 刷新用户缓存数据。
         *
         * @param userInfo 需要更新的用户缓存数据。
         */

        RongIM.getInstance().refreshUserInfoCache(new UserInfo(String.valueOf(mUserDetailsInfo.getUserId()), mNickName, Uri.parse(mUserPic)));
    }


}
